package comm

import (
	"encoding/json"
	"errors"
	"log4go"
)

type MsgHead struct {
	Txn    string
	Client string
	Time   string
	Code   string
	ErrMsg string
}

type MsgTxn struct {
	Type    []string
	RetCode string
}

/* json头预定为网关使用，先系统没有网关，此处头仅解析 */
func AnalyMsg(shead, sbody string) ([]byte, []byte, error) {

	hjson := &MsgHead{}

	err := json.Unmarshal([]byte(shead), &hjson)
	if err != nil {
		log4go.Debug("analyse head json msg error: %s", err.Error())
		hjson.Code = "01"
		hjson.ErrMsg = "报文头解析错误"
		str_hjson, err := json.Marshal(hjson)
		if err != nil {
			return nil, nil, errors.New(hjson.ErrMsg)
		}
		return str_hjson, nil, errors.New(hjson.ErrMsg)
	}

	log4go.Debug("analyse head json msg : %v", *hjson)

	str_bjson, err := AnalyTxnMsg(sbody)
	if err != nil {
		log4go.Debug("analyse body json msg error: %s", err.Error())
		hjson.Code = "02"
		hjson.ErrMsg = "报文体解析错误"
		str_hjson, err := json.Marshal(hjson)
		if err != nil {
			return nil, str_bjson, errors.New(hjson.ErrMsg)
		}
		return str_hjson, str_bjson, errors.New(hjson.ErrMsg)
	}

	hjson.Code = "00"
	hjson.ErrMsg = "成功"
	str_hjson, err := json.Marshal(hjson)
	if err != nil {
		return nil, nil, errors.New("报文头解析错误")
	}
	return str_hjson, str_bjson, nil
}

func AnalyTxnMsg(sbody string) ([]byte, error) {

	jtxn := &MsgTxn{}
	ret_jtxn := &MsgTxn{}

	err := json.Unmarshal([]byte(sbody), &jtxn)
	if err != nil {
		log4go.Debug("analyse txn json msg error: %s", err.Error())
		ret_jtxn.RetCode = "01"
		str_jtxn, err := json.Marshal(ret_jtxn)
		if err != nil {
			return nil, errors.New("组装报文体失败")
		}
		return str_jtxn, errors.New("解析报文体失败")
	}

	log4go.Debug("analyse txn json msg : %v", *jtxn)
	ret_jtxn.RetCode = "00"
	str_jtxn, err := json.Marshal(ret_jtxn)
	if err != nil {
		return nil, errors.New("组装报文体失败")
	}
	return str_jtxn, nil
}
